Java File

一、File 类


File 是“文件”和“目录路径名”的抽象表示形式,它直接继承于 Object,实现了 Serializable 接口和 Comparable 接口。实现 Serializable 接口,意味着 File 对象支持序列化操作。而实现 Comparable 接口,意味着 File 对象之间可以比较大小;File 能直接被存储在有序集合(如 TreeSet、TreeMap 中)。

定义

1
public class File extends Object implements Serializable, Comparable<File>

File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。

构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
// 如果给定字符串是空字符串,那么结果是空抽象路径名。
File(String pathname)
// 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
// 如果 parent 为 null,则创建一个新的 File 实例,
// 这与调用给定 child 路径名字符串的单参数 File 构造方法的效果一样。
// 否则,parent 抽象路径名用于表示目录,child 路径名字符串用于表示目录或文件。
// 如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。
// 如果 parent 是空抽象路径名,则通过将 child 转换为抽象路径名,
// 并根据与系统有关的默认目录解析结果来创建新的 File 实例。
// 否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。
File(File parent, String child)
// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
// 如果 parent 为 null,则创建一个新的 File 实例,
// 这与调用以给定 child 路径名字符串作为参数的单参数 File 构造方法效果一样。
// 否则,parent 路径名字符串用于表示目录,child 路径名字符串用于表示目录或文件。
// 如果 child 路径名字符串是绝对路径名,则用与系统有关的方式将它转换为一个相对路径名。
// 如果 parent 是空字符串,则通过将 child 转换为抽象路径名,
// 并根据与系统有关的默认目录解析结果来创建新的 File 实例。
// 否则,将每个路径名字符串转换为一个抽象路径名,并根据父抽象路径名解析子抽象路径名。
File(String parent, String child)
// 通过将给定的 file: URI转换为一个抽象路径名来创建一个新的 File 实例。
// file: URI 的具体形式与系统有关,因此,由此构造方法执行的转换也与系统有关。
// 对于某个给定抽象路径名 f,可以保证:new File( f.toURI()).equals(f.getAbsoluteFile())
// 只要原始抽象路径名、URI 和新抽象路径名都是在同一 Java 虚拟机(或者它的不同调用)中创建的。
// 但是,当在某一操作系统上的虚拟机中创建的 file: URI
// 在不同操作系统上的虚拟机中被转换为抽象路径名时,这种关系通常是不成立的。
File(URI uri)

利用构造方法,指定路径名、文件名等来构造 File 类的对象,之后调用该对象的 createNewFile() 方法就可以创建出相应的文件。

parent 指定路径(父目录),可以是 File 类对象也可以是字符串, child 中也可以加入路径层级,但要注意,所用的路径必须存在,不存在的路径不会新建。

静态成员

1
2
3
4
5
6
7
8
9
10
11
// 路径分割符":",此字段被初始化为包含系统属性 file.separator 值的第一个字符。
// 在 UNIX 系统上,此字段的值为 '/';在 Microsoft Windows 系统上,它为 '\\'。
public static final String pathSeparator
// 路径分割符':',此字段被初始为包含系统属性 path.separator 值的第一个字符。
// 此字符用于分隔以路径列表 形式给定的文件序列中的文件名。
// 在 UNIX 系统上,此字段为 ':';在Microsoft Windows 系统上,它为 ';'。
public static final char pathSeparatorChar
// 分隔符"/"
public static final String separator
// 分隔符'/'
public static final char separatorChar

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// 按字母顺序比较两个抽象路径名。
int compareTo(File pathname)
// 计算此抽象路径名的哈希码。
int hashCode()
// 构造一个表示此抽象路径名的 file: URI。
URI toURI()
// 已过时。 此方法不会自动转义 URL 中的非法字符。
// 建议新的代码使用以下方式将抽象路径名转换为 URL:
// 首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。
URL toURL()
// 返回此抽象路径名表示的文件最后一次被修改的时间。
long lastModified()
// 返回由此抽象路径名表示的文件的长度。
long length()
// 返回此抽象路径名指定的分区中未分配的字节数。
long getFreeSpace()
// 返回此抽象路径名指定的分区大小。
long getTotalSpace()
// 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
long getUsableSpace()
// 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
void deleteOnExit()
// 返回此抽象路径名的绝对路径名形式。
File getAbsoluteFile()
// 返回此抽象路径名的规范形式。
File getCanonicalFile()
// 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
File getParentFile()
// 返回此抽象路径名的路径名字符串。
String toString()
// 返回此抽象路径名的绝对路径名字符串。
String getAbsolutePath()
// 返回此抽象路径名的规范路径名字符串。
String getCanonicalPath()
// 返回由此抽象路径名表示的文件或目录的名称。
String getName()
// 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
String getParent()
// 将此抽象路径名转换为一个路径名字符串。
String getPath()
// 测试应用程序是否可以执行此抽象路径名表示的文件。
boolean canExecute()
// 测试应用程序是否可以读取此抽象路径名表示的文件。
boolean canRead()
// 测试应用程序是否可以修改此抽象路径名表示的文件。
boolean canWrite()
// 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
boolean createNewFile()
// 删除此抽象路径名表示的文件或目录。
boolean delete()
// 测试此抽象路径名与给定对象是否相等。
boolean equals(Object obj)
// 测试此抽象路径名表示的文件或目录是否存在。
boolean exists()
// 测试此抽象路径名是否为绝对路径名。
boolean isAbsolute()
// 测试此抽象路径名表示的文件是否是一个目录。
boolean isDirectory()
// 测试此抽象路径名表示的文件是否是一个标准文件。
boolean isFile()
// 测试此抽象路径名指定的文件是否是一个隐藏文件。
boolean isHidden()
// 创建此抽象路径名指定的目录。
boolean mkdir()
// 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
boolean mkdirs()
// 重新命名此抽象路径名表示的文件。
boolean renameTo(File dest)
// 设置此抽象路径名所有者执行权限的一个便捷方法。
boolean setExecutable(boolean executable)
// 设置此抽象路径名的所有者或所有用户的执行权限。
boolean setExecutable(boolean executable, boolean ownerOnly)
// 设置此抽象路径名指定的文件或目录的最后一次修改时间。
boolean setLastModified(long time)
// 设置此抽象路径名所有者读权限的一个便捷方法。
boolean setReadable(boolean readable)
// 设置此抽象路径名的所有者或所有用户的读权限。
boolean setReadable(boolean readable, boolean ownerOnly)
// 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。
boolean setReadOnly()
// 设置此抽象路径名所有者写权限的一个便捷方法。
boolean setWritable(boolean writable)
// 设置此抽象路径名的所有者或所有用户的写权限。
boolean setWritable(boolean writable, boolean ownerOnly)
// 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
String[] list()
// 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
String[] list(FilenameFilter filter)
// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] listFiles()
// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FileFilter filter)
// 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter)
// 列出可用的文件系统根。
static File[] listRoots()
// 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
static File createTempFile(String prefix, String suffix)
// 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
static File createTempFile(String prefix, String suffix, File directory)

二、创建文件


File 创建文件使用 file.createNewFile() 函数,因为有四种构造函数,所以有 4 种创建文件的情形。举例:在“dir”目录(相对路径)下新建文件“file1.txt”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 第一种
try {
File dir = new File("dir"); // 获取目录“dir”对应的File对象
File file1 = new File(dir, "file1.txt");
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
// 第二种
try {
File file2 = new File("dir", "file2.txt");
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
// 第三种
try {
File file3 = new File("/home/sky/dir/file3.txt"); //linux创建文件
//File file3 = new File("D:/dir/file4.txt"); // windows创建文件
file3.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
// 第四种
try {
URI uri = new URI("file:/home/skywang/dir/file4.txt");
File file4 = new File(uri);
file4.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}

三、创建目录


根据相对路径创建目录

1
2
File dir = new File("dir");
dir.mkdir();

在当前路径下新建目录“dir”。

根据绝对路径新建目录

1
2
3
File dir = new File("/home/sky/dir"); linux创建
//File dir = new File("D:/dir"); windows创建
dir.mkdirs();

新建目录“/home/sky/dir”。

创建目录第三种方式

1
2
3
URI uri = new URI("file:/home/sky/dir");
File dir = new File(uri);
sub.mkdir();

四、创建子目录


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 方法一
// 在dir目录下新建sub1目录,并且在当前目录下 "dir/sub1"。
// 它能正常运行的前提是“sub1”的父目录“dir”已经存在!
File sub1 = new File("dir", "sub1");
sub1.mkdir();
// 方法二
// 在dir目录下新建sub2目录,并且在当前目录下 "dir/sub2"。
// 它能正常运行的前提是“sub2”的父目录“dir”已经存在!
File sub2 = new File(dir, "sub2");
sub2.mkdir();
// 方法三
// 在dir目录下新建sub3目录,并且在当前目录下 "dir/sub3"。
// 它不需要dir已经存在,也能正常运行;若“sub3”的父母路不存在,
// mkdirs()方法会自动创建父目录。
File sub3 = new File("dir/sub3");
sub3.mkdirs();
// 方法四
// 新建目录"/home/skywang/dir/sub3"。它不需要dir已经存在,
// 也能正常运行;若“sub4”的父母路不存在,
// mkdirs()方法会自动创建父目录。
File sub4 = new File("/home/skywang/dir/sub4");
sub4.mkdirs();
// 方法五
URI uri = new URI("file:/home/skywang/dir/sub5");
File sub5 = new File(uri);
sub5.mkdirs();

五、目录操作示例

  1. 返回文件名数组
    String[] list()
    String[] list(FilenameFilter filter)

  2. 返回 File 数组
    File[] listFiles()
    File[] listFiles(FileFilter filter)
    File[] listFiles(FilenameFilter filter)

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* File 类有一个 listFiles(FileNameFilter filter).
* 只需要实现一个简单的 filter 就可以找到满足 filter 条件的所有文件。
* 例如我要在 E:\data\file_selector_test 目录下面查找以 .txt 结尾的文件
*
* @author 先小涛
*/
class FileNameSelector implements FilenameFilter {
private String extension = ".";
public FileNameSelector(String fileExtensionNoDot) {
extension += fileExtensionNoDot;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(extension);
}
// 删除文件夹下的所有文件以及该文件夹
public static void deleteDirectory(File file) {
File[] fileArray = file.listFiles();
if (fileArray.length > 0) {
for (File f : fileArray) {
if (f.isFile()) {
if (f.delete()) {
System.out.println(f + "文件删除成功");
} else {
System.out.println(f + "文件删除失败");
}
} else {
deleteDirectory(f);
}
}
}
// 删除文件夹
if (file.delete()) {
System.out.println(file + "文件夹删除成功");
} else {
System.out.println(file + "文件夹删除失败");
}
}
// 扫描指定文件夹下的所有文件,并输出
public static void findAllFiles(File f) {
// 判断给定的路径是否是目录
if (f.isDirectory()) {
File[] files = f.listFiles();
// 再依次循环进行判断
for (File file : files) {
// 继续把内容传入到 findAllFiles 方法之中进行验证
findAllFiles(file);
}
} else {
System.out.println(f);
}
}
public static void main(String[] args) {
File directory = new File("E:\\test\\file_selector_test");
// listFiles() 列出所有文件
File[] files = directory.listFiles();
System.out.println("\n目录" + directory.getName() + "下的所有文件");
for (File file : files) {
System.out.print(" " + file.getName());
}
// listFiles(FileNameFilter filter) 列出所有.txt文件
File[] txtFiles = directory.listFiles(new FileNameSelector("txt"));
System.out.println("\n目录" + directory.getName() + "下的.txt文件");
for (File file : txtFiles) {
System.out.print(" " + file.getName());
}
// isDirectory() 判断是否为文件目录
if(directory.isDirectory()) {
System.out.println(directory.getPath() + " is Directory");
}
// isFile() 判断是否为文件
if(directory.isFile()) {
System.out.println(directory.getPath() + " is File");
}
// File.separator输出不同的系统中斜杠的方向
// 在windows中斜杠的方向是向右斜的\\
// 在Linux 中斜杠的方向是向左斜的//
System.out.println("File.separator:" + File.separator);
String pathName = "e:" + File.separator + "test" + File.separator
+ "file_selector_test" + File.separator + "io.txt";
File f = new File(pathName);
try {
// createNewFile() 方法:创建指定文件夹下的文件,如果文件夹不存在
// 会报"找不到指定路径"错误,应该首先手动创建该文件夹。返回值为 boolean
// 若没有该文件,创建成功返回 true;若又该文件则创建失败返回 false
System.out.println(f.createNewFile());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// delete() 方法:删除一个文件或者整个文件夹,返回值为布尔类型
// 如果删除的是文件夹,必须保证是一个空文件夹,否则删除失败
File f0 = new File("E:\\test\\file_selector_test\\io.txt");
boolean boo = f0.delete();
if (boo) {
System.out.println("成功删除文件");
} else {
System.out.println("删除失败");
}
// 调用创建的方法进行删除文件夹以及该文件夹下的所有文件
deleteDirectory(new File("E:\\test\\file_selector_test2"));
File f1 = new File("e:" + File.separator + "test"+File.separator+"io.txt");
// getPath() 方法:将此抽象路径名转换为一个路径名字符串
System.out.println(f1.getPath());
// getParent() 方法:返回此抽象路径名父目录的路径名字符串;
// 如果此路径名没有指定父目录,则返回 nul
System.out.println(f1.getParent());
if (f1.exists()) {
f1.delete();
} else {
try {
System.out.println(f1.createNewFile());
} catch(Exception e){}
}
// list()方法:返回一个字符串数组,这些字符串指定此抽象路径名
// 表示的目录中的文件和目录,列出的仅是名称。
File f2 = new File("E:\\test\\file_selector_test");
String[] str = f2.list();
for(int i=0; i<str.length; i++){
System.out.println(str[i]);
}
// 扫描某个路径下的所有文件
findAllFiles(new File("E:\\"));
}
}

参考链接:Java File 类